package com.evenmo.hrms.config.timeConverter;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * @ClassName AnyTimeConvertersConfig
 * @Description 全局时间转换器，配置前端传来的字符串时间戳或字符串类型时间转换成时间类（Date、LocalDateTime、LocalDate、LocalTime）
 * @Author moyongjun
 * @Date 2022/3/25 23:13
 * @Version 1.0
 **/
@Configuration
public class AnyTimeConvertersConfig {

    /**
     * 全局转换前端的字符串格式时间或者字符串时间戳到LocalDateTime，前端字符串的格式为：yyyy-MM-dd HH:mm:ss
     *
     * @return
     */
    @Bean
    public Converter<String, LocalDateTime> localDateTimeConvert() {


        return new Converter<String, LocalDateTime>() {
            @Override
            public LocalDateTime convert(String source) {

                LocalDateTime localDateTime = null;
                // 根据字符串类型是时间戳还是日期格式自动转换
                if (source.contains("-") || source.contains(" ") || source.contains(":")) {
                    DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

                    try {
                        //2020-01-01 00:00:00
                        switch (source.length()) {
                            case 10:
//                            logger.debug("传过来的是日期格式：{}",source);
                                source = source + " 00:00:00";
                                break;
                            case 13:
//                            logger.debug("传过来的是日期 小时格式：{}",source);
                                source = source + ":00:00";
                                break;
                            case 16:
//                            logger.debug("传过来的是日期 小时:分钟格式：{}",source);
                                source = source + ":00";
                                break;
                        }
                        localDateTime = LocalDateTime.parse(source, df);
                    } catch (Exception e) {
//                    logger.error(e.getMessage(),e);
                    }
                    return localDateTime;
                } else {
                    // 将前端传来的字符串类型的毫秒级时间戳转换成LocalDateTime

                    // 异常处理
                    try {
                        localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(Long.parseLong(source)), ZoneId.of("+8"));
                    } catch (Exception e) {
                        //                    logger.error(e.getMessage(),e);
                    }

                    // 转换到秒级，传入的时间戳除1000操作
                    // LocalDateTime localDateTime1 = LocalDateTime.ofEpochSecond(currentTimeTimestamp/1000, 0, ZoneOffset.of("+8"));
                    return localDateTime;

                }

            }


        };


    }

    /**
     * java.util.Date转换器,字符串时间戳或字符串日期转Date
     * 接收毫秒级时间戳字符串——>Date
     *
     * @return
     */
    @Bean
    public Converter<String, Date> dateConverter() {
        return new Converter<String, Date>() {
            @Override
            public Date convert(String source) {

                Date date = null;
                if (source.contains("-") || source.contains(":") || source.contains(" ")) {
                    try {
//                        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//                        date = simpleDateFormat.parse(source);
                        //或者
                        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                        Instant instant = LocalDateTime.parse(source, dateTimeFormatter).atZone(ZoneId.of("+8")).toInstant();
                        date = Date.from(instant);
                    } catch (Exception e) {
                        // todo 记录异常、处理异常
                    }

                } else {
                    try {
                        date = new Date(Long.parseLong(source));
                        // 或者
                        //date= Date.from(Instant.ofEpochMilli(Long.parseLong(source)));
                    } catch (Exception e) {
                        // 记录异常日志
                        //todo
                    }

                }


                return date;
            }
        };
    }

    /**
     * 全局配置LocalDate转换器，字符串时间戳或字符串日期转LocalDate
     *
     * @return
     */
    @Bean
    //  配置LocalDate转换器
    public Converter<String, LocalDate> localDateConverter() {
        return new Converter<String, LocalDate>() {
            @Override
            public LocalDate convert(String source) {
                DateTimeFormatter dateTimeFormatter = null;
                // 根据前端传递饿不同格式匹配转换规则
                switch (source.length()) {
                    case 10:
                        //LocalTime只匹配时间部分，日期部分规则做冗余处理
                        dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                        break;
                    case 16:
                        //LocalTime只匹配时间部分，日期部分规则做冗余处理
                        dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
                        break;
                    case 19:
                        //LocalTime只匹配时间部分，日期部分规则做冗余处理
                        dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                        break;
                    case 8:
                        dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                        break;
                }

                LocalDate localDate = null;
                // 转换字符串格式日期到LocalDate ,前端格式为 yyyy-MM-dd
                try {
                    if (source.contains("-") || source.contains(" ") || source.contains(":")) {
                        localDate = LocalDate.parse(source, dateTimeFormatter);
                    } else {
                        // 转换字符串时间戳到LocalDate
                        localDate = LocalDateTime.ofInstant(Instant.ofEpochMilli(Long.parseLong(source)), ZoneId.of("+8")).toLocalDate();
                    }
                } catch (Exception e) {
                    //记录日志
                    // todo
                }


                return localDate;
            }
        };
    }

    /**
     * 全局配置LocalTime转换器，字符串时间戳或字符串日期转LocalTime
     *
     * @return
     */
    @Bean
    // 配置LocalTime转换器
    public Converter<String, LocalTime> localTimeConverter() {
        return new Converter<String, LocalTime>() {
            @Override
            public LocalTime convert(String source) {
                DateTimeFormatter dateTimeFormatter = null;
                // 根据前端传递饿不同格式匹配转换规则
                switch (source.length()) {
                    case 19:
                        //LocalTime只匹配时间部分，日期部分规则做冗余处理
                        dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                        break;
                    case 8:
                        dateTimeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
                        break;
                }

                LocalTime localTime = null;
                try {
                    if (source.contains("-") || source.contains(":") || source.contains(" ")) {
                        localTime = LocalTime.parse(source, dateTimeFormatter);
                    } else {
                        localTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(Long.parseLong(source)), ZoneId.of("+8")).toLocalTime();
                    }
                } catch (Exception e) {
                    // 日志处理
                }

                return localTime;
            }
        };
    }
}
